package com.xtm.exercise.base;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.regex.Pattern;

/**
 * 类描述：BigDecimal日常操作
 */
@Slf4j
public class DemoBigDecimal {

    /**
     * 处理科学计数法 ， 输出原始值  toPlainString
     */
    @Test
    public void test041(){
        // 处理科学计数法 ， 输出原始值  toPlainString
        BigDecimal bigDecimal = new BigDecimal("1E+12");
        System.out.println(bigDecimal.toPlainString());

        // 数据初始化，在对小数初始化时，会造成精度异常问题
        BigDecimal b2 = new BigDecimal(3.14);
        System.out.println(b2); // 3.140000000000000124344978758017532527446746826171875

        BigDecimal b1 = new BigDecimal("3.14");
        System.out.println(b1); // 3.14
    }

    /**
     * bigdecimal与零判断（compareTo比较大小）
     */
    @Test
    public void test11(){
        Integer number = 1;
        Integer min1 = 0;
        Integer max1 = 10;
        if(number.compareTo(min1) >= 0){
            System.out.println("true");
        } else {
            System.out.println("false");
        }

        if(max1 == null || number.compareTo(max1) <= 0){
            System.out.println("true");
        } else {
            System.out.println("false");
        }

        System.out.println("===================");
        Integer min2 = 10;
        Integer max2 = null;

        if(number.compareTo(min2) > 0){
            System.out.println("true");
        } else {
            System.out.println("false");
        }

        if(max2 == null || number.compareTo(max2) <= 0){
            System.out.println("true");
        } else {
            System.out.println("false");
        }



    }
    @Test
    public void test01(){
        BigDecimal b1 = new BigDecimal("0");
        int a1 = b1.compareTo(BigDecimal.ZERO);
        if(a1 == 0){
            System.out.println("等于0");
        } else if (a1 == 1){
            System.out.println("大于0");
        } else if (a1 == -1){
            System.out.println("小于0");
        }

        BigDecimal a = new BigDecimal ("101");
        BigDecimal b = new BigDecimal ("111");

        //使用compareTo方法比较
        if(a.compareTo(b) > 0){
            System.out.println("a大于b");
        }
        if(a.compareTo(b) == 0){
            System.out.println("a等于b");
        }
        if(a.compareTo(b) < 0){
            System.out.println("a小于b");
        }
        if(a.compareTo(b) != 0){
            System.out.println("a不等于b");
        }
        if(a.compareTo(b) > -1){
            System.out.println("a大于等于b");
        }
        if(a.compareTo(b) < 1) {
            System.out.println("a小于等于b");
        }

        if(a.compareTo(b) == 1){
            System.out.println("a大于b");
        }
        if(a.compareTo(b) == -1){
            System.out.println("a小于b");
        }



    }

    /**
     * 运算法则
     */
    @Test
    public void test04(){
//        BigDecimal b1 = new BigDecimal("1215.910872");
//        BigDecimal b2 = new BigDecimal("1220.4142456");
//        BigDecimal b3 = new BigDecimal("948.1648416");

        BigDecimal b1 = new BigDecimal("1215.918");
        BigDecimal b2 = new BigDecimal("1220.4214");
        BigDecimal b3 = new BigDecimal("948.1704");
//        加法 add()函数
//        减法subtract()函数
        BigDecimal subtract = BigDecimal.ZERO.subtract(b1);

//        乘法multiply()函数
        BigDecimal bigDecimal1 = b1.setScale(2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal2 = b2.setScale(2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal3 = b3.setScale(2, RoundingMode.HALF_UP);

        BigDecimal add = bigDecimal1.add(bigDecimal2).add(bigDecimal3);
        System.out.println(add);
//        除法divide()函数
    }

    /**
     * 除法(四舍五入)
     */
    @Test
    public void test03(){
        //注意：a、b均不能为null，否则会报空指针
        BigDecimal a1 = null;
        BigDecimal b1 = new BigDecimal("1");
        BigDecimal subtract = a1.subtract(b1);
        System.out.println(subtract);

        BigDecimal a = new BigDecimal ("101");
        BigDecimal b = new BigDecimal ("111");

        BigDecimal divide = a.divide(b, 2, RoundingMode.HALF_UP);
        System.out.println(divide);
    }

    /**0-9的正则表达式**/
    public static final Pattern PATTERN = Pattern.compile("^[-\\+]?[\\d]*$");

    /**
     * 判断字符串是否为整数
     * @param str String对象
     * @return boolean :true 是；false : 不是。
     * @author chenpeng
     * */
    public static boolean isInteger(String str){
        return PATTERN.matcher(str).matches();
    }

    /**
     * 判断字符串是否为整数
     */
    @Test
    public void test05(){
        boolean integer = isInteger("0.3");
        System.out.println(integer);
    }

    /**
     * 格式化数字
     */
    @Test
    public void test06(){
        DecimalFormat df = new DecimalFormat("0");  // 格式化数字
        String format = df.format(12.34);
        System.out.println(format); // 12

        DecimalFormat df1 = new DecimalFormat("0.0");
        DecimalFormat df2 = new DecimalFormat("#.#");
        DecimalFormat df3 = new DecimalFormat("000.000");
        DecimalFormat df4 = new DecimalFormat("###.###");
        System.out.println(df1.format(12.34)); // 12.3
        System.out.println(df2.format(12.34)); // 12.3
        System.out.println(df3.format(12.34)); // 012.340
        System.out.println(df4.format(12.34)); // 12.34


        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        String format1 = decimalFormat.format(12.340000);
        log.info(format1); // 12.34
    }

}
